bool lemonadeChange(int* bills, int billsSize) {
    // step 1# 初始化五元和十元的数量（二十元不记录，因为不会用于找零）
    int fiveCount = 0; 
    int tenCount = 0; 

    // step 2# 遍历每一位顾客的付款金额
    for(int i = 0; i < billsSize; ++i) {
        switch(bills[i]) {

            // step 2.1# 顾客支付5元，无需找零，直接收入一张5元
            case 5:
                fiveCount++;
                break;

            // step 2.2# 顾客支付10元，需要找零5元
            case 10:
                // step 2.2.1# 如果没有5元零钱，无法找零，返回false
                if(fiveCount == 0)
                    return false;

                // step 2.2.2# 正常找零一张5元，并收入一张10元
                fiveCount--;
                tenCount++;
                break;

            // step 2.3# 顾客支付20元，需要找零15元
            case 20:
                // step 2.3.1# 优先使用一张10元和一张5元组合找零
                if(fiveCount > 0 && tenCount > 0) {
                    fiveCount--;
                    tenCount--;
                } 
                // step 2.3.2# 如果没有10元，则尝试使用三张5元找零
                else if(fiveCount >= 3) {
                    fiveCount -= 3;
                } 
                // step 2.3.3# 无法找零，返回false
                else {
                    return false;
                }
                break;
        }
    }

    // step 3# 所有顾客都顺利完成交易，返回true
    return true;
}
